package com.nlscan.qdkit.ui.publico.art.mvvm

import android.content.Context
import androidx.lifecycle.viewModelScope
import com.nlscan.qdkit.common.core.app.App
import com.nlscan.qdkit.common.core.ext.logE
import com.quvii.qvmvvm.core.base.KtxBaseViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext


open class BaseViewModel : KtxBaseViewModel() {

    fun getAppContext() : Context {
        return App.getInstance()
    }


    /**
     *  创建协程作用域, 可自动产生加载框, 对异常进行捕获, 避免出现异常时App崩溃,
     *  由于使用的默认选择, 默认会在子线程中执行, 不可在方法体中直接调用UI操作
     *  -- 2024-12-4 测试没有在子线程工作，当前使用 withContext 切换到 IO 线程
     */
    fun launch(showLoading: Boolean = true, block: suspend CoroutineScope.() -> Unit) {
        viewModelScope.launch {
            if (showLoading) {
                showOrHideLoading(true)
            }

            try {
                // 使用 withContext 切换到 IO 线程执行 block 内的代码
                withContext(Dispatchers.IO) {
                    block()
                }
            } catch (e: Exception) {
                logE(e)
                showMessage("Fail: $e")
            }
            if (showLoading) {
                showOrHideLoading(false)
            }
        }
    }

//    protected open fun setInfo(function: suspend () -> Int, onSuccess: () -> Unit) {
//        launch {
//            val ret = function()
//            if (ret.retSuccess()) {
//                onSuccess()
//            } else {
//                showResult(ret)
//            }
//        }
//    }

//    protected open fun <T> getInfo(function: suspend () -> QvResult<T>, onSuccess: (result: T) -> Unit) {
//        launch {
//            val ret = function()
//            if (ret.retSuccess()) {
//                onSuccess(ret.result)
//            } else {
//                showResult(ret.code)
//            }
//        }
//    }
}